package projectisd.client;

import projectisd.client.VakDelegate;

import java.util.List;


import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

/** 
 * In deze klas wordt de interface aangeroepen om een Vak te kunnen toevoegen
 * in de webbrowse
 * @author Team 2
 * @version 7.0
 */

public class VakGUI {
	/* Constants. */
	private static final String LISTING_ROOT_PANEL = "guiListing";
	private static final String FORM_ROOT_PANEL = "guiForm";
	private static final String STATUS_ROOT_PANEL = "guiStatus";
	private static final String TOOL_BAR_ROOT_PANEL = "guiToolBar";
	private static final int EDIT_LINK = 3;
	private static final int REMOVE_LINK = 4;

	/* GUI Widgets */
	protected Button addButton;
	protected Button updateButton;
	protected Button addNewButton;
	protected TextBox cursusCodeField;
	protected TextBox cursusNaamField;
	protected TextArea cursusOmschrijvingField;
	protected Label titel;
	protected Label status;
	protected Grid listGrid;
	protected Grid formGrid;
	protected Image hulogo;

	/* Data model */
	private List<Vak> vakken;
	private Vak currentVak;
	protected VakDelegate vakService;

	public void init() {
		addButton = new Button("Toevoegen");
		addNewButton = new Button("Vak Toevoegen");
		updateButton = new Button("Update vak");
		hulogo = new Image("http://jansen-schoonhoven.com/Downloads/hulogo.jpg");
		cursusCodeField = new TextBox();
		cursusCodeField.setVisibleLength(25);
		cursusNaamField = new TextBox();
		cursusNaamField.setVisibleLength(25);
		cursusOmschrijvingField = new TextArea();
		cursusOmschrijvingField.setVisibleLines(6);
		titel = new Label("Vakken beheren");
		status = new Label();
		listGrid = new Grid(2,6);

		buildForm();
		placeWidgets();
	}
	
	/** 
	 * In deze methode worden alle Widgets gemaakt die later weer kunnen worden opgehaald
	 */
	
	
	

	private void buildForm() {
		formGrid = new Grid(6,3);
		formGrid.setVisible(false);

		formGrid.setWidget(0, 0, titel);
		formGrid.setWidget(0, 2, hulogo);
		
		formGrid.setWidget(1, 0, new Label("Cursus Code"));
		formGrid.setWidget(1, 1, cursusCodeField);

		formGrid.setWidget(2, 0, new Label("Cursus Naam"));
		formGrid.setWidget(2, 1, cursusNaamField);

		formGrid.setWidget(3, 0, new Label("Cursus Omschrijving"));
		formGrid.setWidget(3, 1, cursusOmschrijvingField);

		formGrid.setWidget(4, 1, updateButton);
		formGrid.setWidget(4, 0, addButton);
	}
	
	/** 
	 * Hier in worden de widgets zoals listgrid formgrid en status geplaats in
	 * de rootpanel 
	 */
	private void placeWidgets() {
		RootPanel.get(LISTING_ROOT_PANEL).add(listGrid);
		RootPanel.get(FORM_ROOT_PANEL).add(formGrid);
		RootPanel.get(STATUS_ROOT_PANEL).add(status);
		RootPanel.get(TOOL_BAR_ROOT_PANEL).add(addNewButton);
	}
	
	/** 
	 * In deze methode wordt uitgevoerd om bepaalde widgets te kunnen hiden als deze wordt aangeroepen
	 */

	public void hideGui() {
		formGrid.setVisible(false);
		listGrid.setVisible(false);
		status.setVisible(false);
		addNewButton.setVisible(false);
	}
	/** 
	 * In deze methode wordt het formulier aangeroepen wat de gebruiker
	 * kan invullen	
	 */

	private void loadForm(Vak vak) {
		this.formGrid.setVisible(true);
		currentVak = vak;
		this.cursusCodeField.setText(vak.getCode());
		this.cursusNaamField.setText(vak.getName());
		this.cursusOmschrijvingField.setText(vak.getOmschrijving());
	}
	
	/** 
	 * In deze methode wordt een Leerling opgeslagen in de database
	 * 
	 */


	private void copyFieldDateToVak() {
		currentVak.setCode(cursusCodeField.getText());
		currentVak.setName(cursusNaamField.getText());
		currentVak.setOmschrijving(cursusOmschrijvingField.getText());
	}
	
	/** 
	 * In deze methode wordt verteld wanneer bepaalde knoppen 
	 * zichtbaar mogen zijn zodra er een bepaalde knop wordt geselecteerd
	 * 
	 */

	public void gui_eventListGridClicked(Cell cellClicked) {
		int row = cellClicked.getRowIndex();
		int col = cellClicked.getCellIndex();

		Vak vak = this.vakken.get(row);
		this.status.setText("Naam was " + vak.getName() + " clicked ");

		if (col==EDIT_LINK) {
			this.addNewButton.setVisible(false);
			this.updateButton.setVisible(true);
			this.addButton.setVisible(false);
			loadForm(vak);
		} else if (col==REMOVE_LINK) {
			if (Window.confirm("Verwijderen vak?")) {
				this.vakService.removeVak(vak);
			}
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat op Addbutton wordt
	 * geclickt voordat de ingevulde gegevens worden opgeslagen.
	 */


	public void gui_eventAddButtonClicked() {
		if (cursusCodeField.getText().length() == 0 &&
				cursusNaamField.getText().length() == 0	&&
				cursusOmschrijvingField.getText().length() == 0)
		{ Window.alert("Alle velden moeten gevuld zijn");
		
		} else if (cursusCodeField.getText().length() == 0)
		{ Window.alert("Cursuscode veld moet gevuld zijn");
		
		} else if (cursusNaamField.getText().length() == 0)
		{ Window.alert("Cursusnaam veld moet gevuld zijn");
		
		} else if (!cursusNaamField.getText().matches("^[A-Z].*$"))
		{ Window.alert("Cursusnaam moet beginnen met een hoofdletter");
		
		} else if (cursusOmschrijvingField.getText().length() == 0)
		{ Window.alert("Cursusomschrijving veld moet gevuld zijn");

		} else {
			addNewButton.setVisible(true);
			formGrid.setVisible(false);
			copyFieldDateToVak();
			this.vakService.addVak(currentVak);
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat op Updatebutton wordt
	 * geclickt voordat de ingevulde gegevens worden opgeslagen.
	 */

	public void gui_eventUpdateButtonClicked() {
		if (cursusCodeField.getText().length() == 0 &&
				cursusNaamField.getText().length() == 0	&&
				cursusOmschrijvingField.getText().length() == 0)
		{ Window.alert("Alle velden moeten gevuld zijn");
		
		} else if (cursusCodeField.getText().length() == 0)
		{ Window.alert("Cursuscode veld moet gevuld zijn");
		
		} else if (cursusNaamField.getText().length() == 0)
		{ Window.alert("Cursusnaam veld moet gevuld zijn");
		
		} else if (!cursusNaamField.getText().matches("^[A-Z].*$"))
		{ Window.alert("Cursusnaam moet beginnen met een hoofdletter");
		
		} else if (cursusOmschrijvingField.getText().length() == 0)
		{ Window.alert("Cursusomschrijving veld moet gevuld zijn");

		}else {

			addNewButton.setVisible(true);
			formGrid.setVisible(false);
			copyFieldDateToVak();
			this.vakService.updateVak(currentVak);
		}
	}
	
	/** 
	 * In deze methode staat wat er moet gebeuren voordat er op de
	 * knop AddnewButton wordt geklikt er wordt hier dus het formulier
	 * getoont wat in de buildform wordt gemaakt
	 */


	public void gui_eventAddNewButtonClicked() {
		this.addNewButton.setVisible(false);
		this.updateButton.setVisible(false);
		this.addButton.setVisible(true);
		Vak vak = new Vak();
		loadForm(vak);
	}
	
	/** 
	 * In deze methode wordt de lijst getoont met een for
	 */


	public void service_eventListRetrievedFromService(List<Vak> result) {
		status.setText("Retrieved vak list");
		status.setVisible(true);

		//formGrid.setVisible(false);
		listGrid.setVisible(true);
		status.setVisible(true);
		addNewButton.setVisible(true);

		this.vakken = result;
		this.listGrid.clear();
		this.listGrid.resizeRows(this.vakken.size());
		int row = 0;
		this.addNewButton.setVisible(true);

		for (Vak vak : result) {
			this.listGrid.setWidget(row, 0, new Label (vak.getCode()));
			this.listGrid.setWidget(row, 1, new Label (vak.getName()));
			this.listGrid.setWidget(row, 2, new Label (vak.getOmschrijving()));
			this.listGrid.setWidget(row, EDIT_LINK, new Hyperlink("Edit", null));
			this.listGrid.setWidget(row, REMOVE_LINK, new Hyperlink("Remove", null));
			row ++;
		}
	}
	
	/** 
	 * In deze methode wordt verteld of de gegevens goed zijn toegevoegd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventAddVakSuccessful() {
		status.setText("Vak was successfully added");
		this.vakService.listVakken();
	}
	
	/** 
	 * In deze methode wordt verteld of de gegevens goed is geupdated
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventUpdateSuccessful() {
		status.setText("Vak was successfully updated");
		this.vakService.listVakken();
	}
	
	/** 
	 * In deze methode wordt verteld of de date goed is verwijderd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */
	
	public void service_eventRemoveVakSuccessful() {
		status.setText("Vak was removed");
		this.vakService.listVakken();
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is geupdated
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventUpdateVakFailed(Throwable caught) {
		status.setText("Update vak failed");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is toegevoegd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventAddVakFailed(Throwable caught) {
		status.setText("Unable to update vak");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed is verwijderd
	 * aan de database zo niet toont hij een status tekst met het resultaat
	 */

	public void service_eventRemoveVakFailed(Throwable caught) {
		status.setText("Remove vak failed");
	}
	
	/** 
	 * In deze methode wordt verteld of de date niet goed wordt getoont
	 * in de lijst
	 */

	public void service_eventListVakFailed(Throwable caught) {
		status.setText("Unable to get vak list");

	}

}
